package com.pyk.controller;


import com.pyk.entity.Result;
import com.pyk.entity.User;
import com.pyk.service.UserService;
import com.pyk.utils.JwtUtil;
import com.pyk.utils.Md5Util;
import com.pyk.utils.ThreadLocalUtil;
import org.hibernate.validator.constraints.URL;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.constraints.Pattern;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/user")
@Validated  //这个注解用于参数校验
public class UserController {

    @Autowired
    private UserService userService;

    /**
     * 用户注册功能
     * @param username
     * @param password
     * @return
     */
    @PostMapping("/register")
    public Result register(@Pattern(regexp ="^\\S{5,16}")   String username,@Pattern(regexp ="^\\S{5,16}")  String password)
    {
        //用户名是否被占用
        //查询用户
        User user= userService.findByUsername(username);
        if(user!=null){
            //被占用
            return Result.error("被占用");
        }
        else {
            userService.register(username,password);
            return Result.success();
        }
    }

    /**
     * 登录功能
     * @param username
     * @param password
     * @return
     */

    @PostMapping("/login")
    public Result<String> login(@Pattern(regexp ="^\\S{5,16}")   String username,@Pattern(regexp ="^\\S{5,16}")  String password)
    {
        //查询用户
        User user= userService.findByUsername(username);
        if(user==null)
        {
            return Result.error("用户不存在");
        }
        else
        {   //判断用户密码是否正确 数据库中的是密文
            if(Md5Util.getMD5String(password).equals(user.getPassword()))//如果匹配正确
            {
                Map<String, Object> claims = new HashMap<>();
                claims.put("id", user.getUserId());
                claims.put("username",user.getUsername());
                String token= JwtUtil.genToken(claims);
                return Result.success(token);
            }
            else return Result.error("密码不正确");
        }

    }

    /**
     * 获取用户全部信息 （除了密码）
     * @param token
     * @return
     */

    @GetMapping("/userInfo")
    public Result<User> getUserInfo(@RequestHeader(name="Authorization") String token){
        Map<String,Object> map = ThreadLocalUtil.get();
        String username =(String) map.get("username");
        //从令牌中获取用户名
        //再用用户名查询
        //返回数据
        return  Result.success(userService.findByUsername(username)) ;

    }

    /**
     * 修改用户基本信息
     * @param user
     * @return
     */
    @PutMapping("/update")
    public Result updateUserInfo(@RequestBody @Validated User user){//自动校验实体类的格式
            //这个id应该从令牌中拿，不然不靠谱，这个以后应该注意

            userService.update(user);
            return Result.success("修改成功");
            //难道没有修改失败吗

    }

    /**
     * 更新头像url
     * @param avatarUrl
     * @return
     */
    @PatchMapping("/updateAvatar")
    public Result updateAvater(@RequestParam  @URL String avatarUrl){ //这个注解是为了 和校验URL
        userService.updateAvatar(avatarUrl);
        return Result.success();
    }

    @PatchMapping("/updatePwd")
    public Result updatePwd(@RequestBody Map<String,String> params){
        //参数校验
        String oldPwd = params.get("old_pwd");
        String newPwd = params.get("new_pwd");
        String rePwd  = params.get("re_pwd");
        //看参数传过来没有

        if(!StringUtils.hasLength(oldPwd)||!StringUtils.hasLength(newPwd)||!StringUtils.hasLength(rePwd))
        {
            return Result.error("缺少必要的参数");
        }

        //原密码是否正确
        Map<String,Object> map = ThreadLocalUtil.get();
        String username=(String)map.get("username");
        User user= userService.findByUsername(username);
        if(!user.getPassword().equals(Md5Util.getMD5String(oldPwd))){
            return Result.error("原密码不一致");
        }
        if(!newPwd.equals(rePwd))
        {
            return Result.error("两次填写的新密码不一致");
        }
        //更新密码
        Integer userId = user.getUserId();
        userService.updatePwd(newPwd,userId);
        return Result.success("更新密码成功");
    }

}

